package day.day13.practice.demo;

import org.junit.Test;

import java.lang.reflect.Field;
import java.sql.SQLOutput;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author wangzhipeng
 * @Date 2020-08-18 9:15 上午
 * @Description 演示数据库与JavaBean 绑定
 *  问题：
 *  1. 可能声明的字段中没有注解
 *      解决：判断字段中是否有该注解，有再处理，没有放过
 *  2. 如何判断更多类型的javaBean
 *      解决：不是固定死的User
 */
public class DemoTestDemo {

    @Test
    public void demo() throws IllegalAccessException {
        //1. 数据库部分
        Map<String, Object> data = createData();
        //2. 数据绑定部分
        User u = reflect(data);
        //3. 验证
        System.out.println("User的name值是"+u.getName()+" 密码"+u.getPassword());
    }

    /**
     * 数据映射部分
     * @param data
     * @return
     */
    private User reflect(Map<String, Object> data) throws IllegalAccessException {
       
        User u = new User();
        Class<? extends User> userClass = u.getClass();
        Field[] declaredFields = userClass.getDeclaredFields();
        for(Field field:declaredFields){
            //获取字段上的注解
            Entity annotation = field.getAnnotation(Entity.class);
           //获取注解上的值
            String name = annotation.value();
            //依据注解值获取数据库数据
            Object value =  data.get(name);
            //给字段赋值
            if(!field.isAccessible()){
                field.setAccessible(true);
            }
            field.set(u,value);

        }
        return u;
    }

    /**
     * 模拟数据
     * @return
     */
    public Map<String,Object> createData(){

        Map<String,Object> data = new HashMap<>();
        data.put("t_name","张三");
        data.put("t_password","123456");

        return data;
    }

}
